const fs = require('fs')
function mineReadFile(path){
    return new Promise((resolve,reject)=>{
        fs.readFile(path,(err,data)=>{
        if (err){
            reject(err)
        }
        resolve(data.toString())
        })
    })
}
//方法一。promise和generator
// async(
//     function * (){
//         //返回异步结果的函数在等待异步结果返回时应当能够暂停 ，注意function*，我们在使用生成器
//         console.log('start')
//         let fs1 = yield mineReadFile('./fs1.txt')
//         //这里会打印出mineReadFile('./fs1.txt')异步函数的执行结果，一般是成功回调
//         console.log('fs1----'+fs1)
//         let fs2 = yield mineReadFile('./fs2.txt')
//         console.log('fs2-----'+fs2)
//         let fs3 = yield mineReadFile('./fs3.txt')
//         console.log('fs3----'+fs3)
//     }
// )



// console.log(val instanceof Promise)//true
// //定义一个辅助函数，用于对我们定义的生成器 执行操作
// function async(main){
//     //创建一个迭代器，进而我们可以控制生成器
//     var iter = main()
//    //定义函数对生产器产生对每个值进行处理
//    //定义函数handle，用于对生成器产 生的每个值进行处理
//     function handle(generatorres){
//         //当生成器没有更多结果返回时停 止执行
//         if(generatorres.done) return;
//         var val = generatorres.value
//    //如果生成 的值是一个promise，则对其注册成功和失败回调。这是异步处理的部分。如果promise成功 返回，则恢复生成器的执行并传入promise的返回结果。
//    //如果遇到错误，则向生成器抛出异常
//         if (val instanceof Promise){
//             val.then((r)=>{
//                 //注意⚠️注意⚠️
//                 //这里采用next(..),首先先第一次primose返回结果传给yield表达式
//                 //让生成器从暂时挂起恢复到执行状态
//                 handle(iter.next(r))       
//             }).catch(err => {iter.throw(err)})
//         }    
//     } 
//     //重启生成器的执行
//     try {
//         handle(iter.next())
//     } catch (error) {
//         iter.throw(error)
//     }
// }
//方法二 多次繁琐next（）
// function * main(){
//     console.log('start')
//     yield mineReadFile('./fs1.txt')
//     yield mineReadFile('./fs2.txt')
//     yield mineReadFile('./fs3.txt')

// }
// var main = main()
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })


//async/await and generator

// async function * main(){
//     console.log('start')
//     res =[]
//     res.push( await mineReadFile('./fs1.txt'))
//     //yield console.log(fs1)
//     res.push(await mineReadFile('./fs2.txt'))
//     //yield console.log(fs1)
//     res.push(await mineReadFile('./fs3.txt'))
//     yield res
// }
// var main = main()
// main.next().then(val => {
//     console.log(val)
// })
// async function main(){
//     p1 = await mineReadFile('./fs1.txt')
//     console.log(p1)
//     p2 = await mineReadFile('./fs2.txt')
//     console.log(p2)
//     p3 = await mineReadFile('./fs3.txt')
//     console.log(p3)
   
// }
// main()







